/*
 * Covian, Fernanda V.
 * Sayes, Andrès
 */
package proycompalex1;
import java.util.EnumMap;
/**
 * Esta clase almacena las trancisiones de estado del autómata finito que reconoce lexicalmente a programas en
 * el lenguaje Minijava
 */
public class estados {
 private  int tabla[][];
 private boolean aceptadores[];

 /**
  *@deprecated No se utiliza desde la clase {@link analizadorLex} dado que el analizador Léxico representa los estados con
  * bloques. Esto produce un acoplamiento muy grande entre estas dos clases, pero se gana en eficiencia reduciendo
  * el número de mensajes que se emiten entre los objetos de las dos clases
  */
 public boolean esAceptador(int estado)
    {
        return aceptadores[estado];
    }
 /**
 * Est metodo es utilizado para retornar el valor entero del asccii de un caracter
 * @param str caracter representado en un String que se le calculara su ascci correspondiente
 * @return un entero representando el valor entero del ascii de parametro {@link str}
 */
    private int ascii(String str)
    {
        int valor;
        valor=str.charAt(0);
        return valor;
    }
 
    private int pos(String str)
    {
        return (ascii(str) - 32);
    }
/**
 *Este método es el mas importante de la clase dado que es el que retorna cual es el siguiente estado
 * correspondiente a aplicar la transicin al estado {@link estado} y el caracter {@link caracter}
 * d(Si,CARACTERi)=Sj 
 * @param estado és el estado actual del autómata finito
 * @param caracter es el caracter actual
 * @return retorna un valor entero represetando el estado siguiente al cual debe ir el autómata luego de aplicar
 * la transición 
 */
    public int transicion(int estado, String caracter)
    {
        return tabla[estado][pos(caracter)];
    }
 /**
 *El contructor de la clase crea la tabla de transición de estados
 *d(Si,CARACTERi)=Sj 
 */
    public estados()
    {
        int estado;
        int i;
        String caracter;
        tabla = new int [37][95];/*indices 0 al 36 y  del 0 al 94*/
        /*--d(S0,0)=1---*/
        estado=0;
        for (i=16;i<=25;i++)/*d(S2,ascii)=4 */
        {
            tabla[estado][i]=1;
        }
        /*********************************/
        /*--d(S0," ")=0---*/
        caracter=" ";
        tabla[estado][pos(caracter)]=0;
        /*--d(S0,')=2---*/
        caracter="'";
        tabla[estado][pos(caracter)]=2;
        /*--d(S0,")=6---*/
        caracter="\"";
        tabla[estado][pos(caracter)]=6;
        /*--d(S0,{)=10---*/
        caracter="{";
        tabla[estado][pos(caracter)]=10;
        /*--d(S0,})=1---*/
        caracter="}";
        tabla[estado][pos(caracter)]=11;
        /*--d(S0,()=1---*/
        caracter="(";
        tabla[estado][pos(caracter)]=12;
        /*--d(S0,))=1---*/
        caracter=")";
        tabla[estado][pos(caracter)]=13;
        /*--d(S0,;)=1---*/
        caracter=";";
        tabla[estado][pos(caracter)]=14;
        /*--d(S0,&)=15--*/
        caracter="&";
        tabla[estado][pos(caracter)]=15;
        /*--d(S0,=)=17--*/
        caracter="=";
        tabla[estado][pos(caracter)]=17;
        /*--d(S0,!)=19--*/
        caracter="!";
        tabla[estado][pos(caracter)]=19;
        /*--d(S0,<)=21--*/
        caracter="<";
        tabla[estado][pos(caracter)]=21;
        /*--d(S0,>)=23---*/
        caracter=">";
        tabla[estado][pos(caracter)]=23;
        /*--d(S0,+)=25--*/
        caracter="+";
        tabla[estado][pos(caracter)]=25;
        /*--d(S0,-)=26---*/
        caracter="-";
        tabla[estado][pos(caracter)]=26;
        /*--d(S0,*)=27--*/
        caracter="*";
        tabla[estado][pos(caracter)]=27;
        /*--d(S0,%)=28--*/
        caracter="%";
        tabla[estado][pos(caracter)]=28;
        /*--d(S0,,)=29--*/
        caracter=",";
        tabla[estado][pos(caracter)]=29;
        /*--d(S0,.)=30--*/
        caracter=".";
        tabla[estado][pos(caracter)]=30;
        ///////////////////////////////////////////////////////////////
        /*--d(S0,a)=31--*/
        for (i=33;i<=58;i++)/*d(S2,ascii)=4 */
        {
            tabla[estado][i]=31;
        }
        for (i=65;i<=90;i++)/*d(S2,ascii)=4 */
        {
            tabla[estado][i]=31;
        }
        caracter="_";
        tabla[estado][pos(caracter)]=31;
        caracter="$";
        tabla[estado][pos(caracter)]=31;
        /*--d(S0,/)=32--*/
        caracter="/";
        tabla[estado][pos(caracter)]=32;
         /*--d(S0,|)=35--*/
        caracter="|";
        tabla[estado][pos(caracter)]=35;
        /*-----ESTADO 1---------------------------------------------*/
        estado=1;
        /*--d(S1,0)=1---*/
        for (i=16;i<=25;i++)/*d(S2,ascii)=4 */
        {
            tabla[estado][i]=1;
        }
        /*-----ESTADO 2---------------------------------------------*/
        estado=2;
        for (i=0;i<=94;i++)/*d(S2,ascii)=4 */
        {
            tabla[estado][i]=4;
        }
        /*--d(S2,/)=5---*/
        caracter="'";
        tabla[estado][pos(caracter)]=5;
        /*--d(S2,\)=3---*/
        caracter="\\";
        tabla[estado][pos(caracter)]=3;
        /*-----ESTADO 3---------------------------------------------*/
        estado=3;
        /*--d(S3,')=4---*/
        caracter="'";
        tabla[estado][pos(caracter)]=4;
        /*--d(S3,\)=4---*/
        caracter="\\";
        tabla[estado][pos(caracter)]=4;
        /*--d(S3,")=4---*/
        caracter="\"";
        tabla[estado][pos(caracter)]=4;
        /*-----ESTADO 4---------------------------------------------*/
        estado=4;
        /*--d(S4,')=5---*/
        caracter="'";
        tabla[estado][pos(caracter)]=5;
        /*-----ESTADO 6---------------------------------------------*/
        estado=6;
        for (i=0;i<=94;i++)/*d(S6,ascii)=8 */
        {
            tabla[estado][i]=8;
        }
        /*--d(S6,")=9---*/
        caracter="\"";
        tabla[estado][pos(caracter)]=9;
        /*--d(S6,\)=7---*/
        caracter="\\";
        tabla[estado][pos(caracter)]=7;
        /*-----ESTADO 7---------------------------------------------*/
        estado=7;
        /*--d(S7,')=8---*/
        caracter="'";
        tabla[estado][pos(caracter)]=8;
        /*--d(S7,\)=8---*/
        caracter="\\";
        tabla[estado][pos(caracter)]=8;
        /*--d(S7,')=8---*/
        caracter="\"";
        tabla[estado][pos(caracter)]=8;
        /*-----ESTADO 8---------------------------------------------*/
        estado=8;
        for (i=0;i<=94;i++)/*d(S8,ascii)=8 */
        {
            tabla[estado][i]=8;
        }
        caracter="\"";
        tabla[estado][pos(caracter)]=9;
        /*--d(S8,\)=7---*/
        caracter="\\";
        tabla[estado][pos(caracter)]=7;
        /*-----ESTADO 15---------------------------------------------*/
        estado=15;
        /*--d(S15,&)=16--*/
        caracter="&";
        tabla[estado][pos(caracter)]=16;
        /*-----ESTADO 17---------------------------------------------*/
        estado=17;
        /*--d(S17,=)=18--*/
        caracter="=";
        tabla[estado][pos(caracter)]=18;
        /*-----ESTADO 19---------------------------------------------*/
        estado=19;
        /*--d(S19,=)=20--*/
        caracter="=";
        tabla[estado][pos(caracter)]=20;
        /*-----ESTADO 21---------------------------------------------*/
        estado=21;
        /*--d(S21,=)=22---*/
        caracter="=";
        tabla[estado][pos(caracter)]=22;
        /*-----ESTADO 23---------------------------------------------*/
        estado=23;
        /*--d(S23,=)=24---*/
        caracter="=";
        tabla[estado][pos(caracter)]=24;
        /*-----ESTADO 31---------------------------------------------*/
        estado=31;
        for (i=16;i<=25;i++)/*d(S31,dig)=31 */
        {
            tabla[estado][i]=31;
        }
        for (i=33;i<=58;i++)/*d(S31,letra mayus)=31 */
        {
            tabla[estado][i]=31;
        }
        for (i=65;i<=90;i++)/*d(S31,letra min)=31 */
        {
            tabla[estado][i]=31;
        }
        /*-----ESTADO 32---------------------------------------------*/
        estado=32;
        /*--d(S32,/)=0---*/
        caracter="/";
        tabla[estado][pos(caracter)]=0;
        caracter="*";
        tabla[estado][pos(caracter)]=33;
        /*-----ESTADO 33---------------------------------------------*/
        estado=33;
        /*--d(S33,*)=34---*/
        for (i=0;i<=94;i++)/*d(S31,letra min)=31 */
        {
            tabla[estado][i]=33;
        }
        caracter="*";
        tabla[estado][pos(caracter)]=34;
        /*-----ESTADO 34---------------------------------------------*/
        /*--d(S34,/)=0---*/
        estado=34;
        for (i=0;i<=94;i++)
        {
            tabla[estado][i]=33;
        }
        caracter="/";
        tabla[estado][pos(caracter)]=0;
        /*--d(S34,*)=34---*/
        caracter="*";
        tabla[estado][pos(caracter)]=34;
         /*-----ESTADO 35---------------------------------------------*/
        /*--d(S35,|)=36---*/
        estado=35;
        caracter="|";
        tabla[estado][pos(caracter)]=36;
    }//constructor
}//clase
